iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
Software Development

用leetcode系統化學習C語言系列 第 9

指標(pointer)與動態記憶體(malloc/calloc/realloc/free)攻略-1

  • 分享至 

  • xImage
  •  

Q:為什麼要學習這個指標(pointer)與動態記憶體(malloc/calloc/realloc/free)?

A:指標和動態記憶體是 C 的核心能力:很多資料結構(動態陣列、鏈結串列、樹、圖)都靠它們撐場;LeetCode 許多題目(回傳陣列、字串處理、建樹)也需要用到。接下來把基礎打好,之後所有「看起來很神奇」的程式技巧都會變得合理。
要學會的重點:
1.指標的基本概念:什麼是指標、&、*、解參考(dereference)
2.指標與陣列的關係:arr[i] 與 *(arr + i)
3.為什麼不能回傳指向區域變數的指標(stack vs heap)
4.malloc / calloc / realloc 用法與差別,以及安全習慣(檢查回傳值、sizeof 寫法)
5.free() 的必要性、常見錯誤(記憶體泄漏、use-after-free、double-free)
6.指標進階:指標當參數(修改呼叫者的指標)、二重指標、結構體配合 malloc
7.偵錯建議(-Wall、ASan、valgrind)
8.LeetCode 常見模板:如何在題目中正確 malloc 並回傳(含範例)

今天先來介紹指標基礎(直觀解釋)

變數是放在記憶體的一個「儲存格」,裡面放值(例如 int a = 10;)
"指標(pointer)"是一個變數,裡面存的是「另一個變數的位址」。

int *p:表示 p 是個指向 int 的指標
&a:取得變數 a 的位址
*p:解參考(拿出 p 指到的那個儲存格的值)

範例:
int a = 10; // a 放 10
int *p = &a; // p 存 a 的位址
// 現在:*p == 10,而 p 存的是位址
*p = 20; // 透過指標修改 a 的值,現在 a == 20

陣列與指標的關係:
在 C 裡,陣列名可以視為指向第一個元素的指標
arr[i] 等同 *(arr + i)。

範例:
int arr[3] = {1,2,3};
int *p = arr; // p 指向 arr[0]
printf("%d\n", arr[1]); // 2
printf("%d\n", *(p + 1)); // 2


上一篇
練習 C 語言追蹤最大值技巧
下一篇
指標(pointer)與動態記憶體(malloc/calloc/realloc/free)攻略-2
系列文
用leetcode系統化學習C語言12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言